package com.cskaoyan.javase.method._0introduction;

/**
 * 通过方法来复用代码
 * 方法的语法
 *
 * 定义一个方法是以下语法结构：
 * [修饰符列表] 返回值类型 方法名 (形式参数列表){
 *   // 方法体
 * }
 * 逐一解释以上方法中的语法结构:
 * 1.修饰符列表,能够修饰方法的修饰符组成的列表.
 *      目前我们先不深入研究方法的修饰符,等到面向对象再详细讲这些东西
 *      目前,我们先默认方法的修饰符列表和main方法保持一致,是public static修饰的
 *      注意,方法的修饰符列表可以是空的,可以省略修饰符,可以不用任何修饰符
 *
 * 2.返回值类型,方法返回值的数据类型(还会包含一些特殊情况)
 *      返回值: 方法在实现功能以后,可能是有结果的,这个结果就是返回值,方法调用结束后,返回值会传递给方法外部,可以方法的外部使用方法的返回值.
 *
 * 3.方法名,尽量用合法英文,见名知意,小驼峰.方法往往是实现功能的,所以方法名普遍会带一个动词
 *      比如求最大值,getMaxValue
 *
 * 4.形式参数列表,简称形参,它指的是由形式参数组成的列表.
 *      形式参数: 在方法定义当中,形式参数负责告诉方法的调用者,需要传入参数的数据类型
 *          并且外部将参数传递给方法后,方法内部是需要使用这个参数的
 *          所以形式参数还需要起个名字.
 *      形式参数列表: 在方法定义当中,形式参数列表负责告诉方法的调用者,需要传入参数的个数以及顺序.
 *      形式参数的语法是: 数据类型 形参名;
 *      形式参数列表: 可以是多个,可以是1个,也可以没有是0个,一般来说,没有形参的方法,称之为"无参方法",表示该方法不需要传入任何参数就可以调用.有形参的方法就是"有参方法"
 *      一个非常关键的问题:
 *      形式参数,形参是不是一个真正意义上的参数,是不是一个真的数值?
 *          不是,形参不是真的参数,只是一个形式,只是为了告诉方法调用者方法需要的参数是什么.
 *
 *  5.方法体,方法实现功能需要的代码组成的合集,当然可以是空的.
 *
 * 两个重要的概念:
 *      1.方法的声明(方法头)
 *      [修饰符列表] 返回值类型 方法名 (形式参数列表) 合起来称之 方法的声明（也叫方法头）
 *      2.方法的签名
 *      方法名 (形式参数列表) 合起来称之为 方法的签名
 *      方法的签名往往用于唯一的确定一个方法(有前提条件)
 *
 * 以上关于方法的语法就结束了,接下来我们尝试定义(声明)一个方法.
 * 就以定义"求两个int类型数据的和"为案例,定义方法.
 *
 * 以下问题:
 * 1.方法应该定义在什么位置?
 *   类体中,其余方法(代码块)之外的平行位置
 *
 * 2.Missing return statement 这个错误是什么问题?
 *      如果方法在定义时,返回值类型明确了方法需要给出一个返回值,那么就必须在方法体中
 *      用"return + 数值/表达式"
 *      来表示方法的返回值
 *      当然return在这里仍然是表示结束方法的
 *      return执行逻辑的后面是不能再写代码的
 *
 * 3.Local variable 'sum' is redundant 这个警告是什么问题?
 * Local variable 是局部变量
 * 这个局部变量sum是多余的,它没有存在的必要,要去掉它
 *
 * 4.一个类当中的方法定义,它们之间是平行的关系,方法不调用不执行.一个方法(一段代码)要想被执行,要么直接在main方法中调用它,要么就是间接被调用.(因为main方法是入口方法)
 *
 * 5.方法如何调用?
 * 在同一个类当中,修饰符列表中存在static的方法,在main方法中如何调用呢?
 * 直接使用方法名调用即可,但需要注意根据形参列表传入对应的参数
 * 这种在方法调用时,传入的真正的数据,真正的参数
 * 称之为"实际参数",简称实参
 *
 * 注意实参的数据类型,个数要和形参列表对应,否则会报错.
 *
 * 6.Result of 'NewDemo.sumIntNums()' is ignored
 * 这样一个警告信息是什么意思?
 * 这次方法调用的返回值被忽视了,建议你处理这个返回值
 * 处理一次方法调用,就是处理这次方法调用的返回值
 * 如果这次方法调用的返回值是int,就可以加减乘除,但是不能求长度
 *
 * 注意事项/细节:
 *      1.在一个类当中,多个方法定义是平行关系,方法定义的位置是不影响方法的调用结果的
 *      2.Java当中的方法是不能直接的,明确的给出两个返回值的,这个返回值从明面上看只能是唯一的.
 *      当方法有需求返回多个数据时,只需要将返回值设定为一个容器(主要指的是数组和集合)就可以了.
 *      3.在同一个类当中,方法的修饰符列表有static修饰的方法,都可以通过方法名直接互相调用.
 *
 * @since 09:33
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class NewDemo {
    public static void main(String[] args) {
        // 调用sumIntValue方法
        int a = 10;
        int b = 20;
        System.out.println(sumIntNums(10, 2));
        System.out.println(sumIntNums(a, b) + 100);
        System.out.println(sumIntNums(a, 200) * 10);

        System.out.println(test());
        System.out.println(test() + 100);
        // System.out.println(test() - 100);
        System.out.println(test().length());
    }

    // 求两个int类型数据的和,并且需要方法返回这个结果
    public static int sumIntNums(int num1, int num2) {
        /*int sum = num1 + num2;
        return sum;*/
        return num1 + num2;
    }

    public static String test() {
        // test2这个方法是在main方法中间接被调用了
        System.out.println(test2());
        return "hello world";
    }

    public static double test2() {
        return 0.1;
    }
}
